/*
 * ComponenteDistribuidorGeneradorMetodoGetter.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 2/03/2011, 07:30:49 PM
 */

package com.ufps.cuatro.modelo.representacion.componente;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.ufps.cuatro.modelo.biblioteca.TipoBiblioteca;
import com.ufps.cuatro.modelo.representacion.PlantillaCombo;
import com.ufps.cuatro.modelo.representacion.PlantillaComponente;
import com.ufps.cuatro.modelo.representacion.TipoMetodo;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;

/**
 * <i><b>ComponenteDistribuidorGeneradorMetodoGetter:</b></i>Esta Clase es utilizada para 
 * la representación de devolución de Propiedades de Clases del Modelo Analizado.
 * 
 * Esta clase es un envoltorio sobre el Componente Generador que representa
 * la propiedad analizada.
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 2/03/2011
 * @see ComponenteDistribuidorGeneradorMetodo
 * @see ObjectBase
 */
public class ComponenteDistribuidorGeneradorMetodoGetter extends ComponenteDistribuidorGeneradorMetodo{
    private static final long serialVersionUID = -5315490277300877314L;
    
    private int idClaseComponenteGeneradorMetodoGetter;
    /**
     * Serie Númerica para la generación de id de Objetos.
     */
    public static int serialIdComponenteGeneradorMetodoGetter;        
    private ComponenteDistribuidorGenerador objComponenteGeneradorReturn;            

    /** 
     * Constructor por Defecto.      
     * @param objComponenteBase 
     * @param strClassPathTipoDato @DefinicionParametro     
     * @param heredado indica si el Objeto es parte de una cadena de herencia o es un objeto final.
     * @param previsualizar  indica si el objeto puede generar vistas previas.
     */
    public ComponenteDistribuidorGeneradorMetodoGetter(ComponenteBaseStandar objComponenteBase, String strClassPathTipoDato, boolean heredado, boolean previsualizar) {
        super(objComponenteBase, strClassPathTipoDato, true, true);
        this.heredado = heredado;
        this.previsualizar = previsualizar;        
        this.eMetodo = TipoMetodo.eGetter;        
        this.dni = Utileria.leerRecursoTexto("Utileria.dni.componente.distribuidor.generador.metodo.getter");  
        if(!heredado){
            this.idClaseComponenteGeneradorMetodoGetter = (!previsualizar) ?
            ComponenteDistribuidorGeneradorMetodoGetter.serialIdComponenteGeneradorMetodoGetter++ :
            ComponenteDistribuidorGeneradorMetodoGetter.serialIdComponenteGeneradorMetodoGetter;        
        } 
    }

    /**
     * Devuelve el id de creación del Componente. No se debe confundir con el #getId()
     * @return Id de Definición de la Clase.
     */
    public int getIdClaseComponenteGeneradorMetodoGetter() {
      try{
        return idClaseComponenteGeneradorMetodoGetter;
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }  
    
    public void crearDistribuicionGrupalInicial(PlantillaCombo objPlantillaCombo, ArrayList<PlantillaComponente> objTempPlantillasComponentes){                
       try{
            ArrayList<Componente> objComponentesIncluidos = new ArrayList<Componente>();
            //Ubicar cada Plantilla con el Componente Asigando y Actualizar
            //Esta busqueda se hace por medio del id
            for(PlantillaComponente objTempPlantillaComponente : objTempPlantillasComponentes){
                if(objTempPlantillaComponente.isGenerador()){                
                    this.objComponenteGeneradorReturn.agregarDistribucionIndividual(objPlantillaCombo, objTempPlantillaComponente);
                    objComponentesIncluidos.add(this.objComponenteGeneradorReturn);
                }            
            }
            Distribuidor objDistribuidor = new Distribuidor(objComponentesIncluidos, objPlantillaCombo);
            this.agregarDistribucionGrupal(objPlantillaCombo, objDistribuidor);        
        }catch(java.lang.NullPointerException ex){}
    }
      
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialHorizontal(PlantillaCombo objPlantillaCombo){
        try{            
            int filas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();            
            //Se crea la Plantilla Componente para el Componente Parent
            PlantillaComponente objPlantilla = new PlantillaComponente();                            
            objPlantilla.setX(proxX);
            objPlantilla.setY(filas);            
            objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGeneradorReturn, objPlantillaCombo, true);
            objPlantilla.setGenerador(true);
            objPlantilla.setHeight(this.objComponenteGeneradorReturn.getObjGridBagConstraints().gridheight);
            objPlantilla.setWidth(this.objComponenteGeneradorReturn.getObjGridBagConstraints().gridwidth);                    
            objPlantilla.setIdComponente(this.objComponenteGeneradorReturn.getId());
            objPlantilla.setId(objTempPlantillas.size());
            objPlantilla.setIdPlantilla(0);
            objPlantilla.setIncluido(true);
            objPlantilla.setZona(0);
            objTempPlantillas.add(objPlantilla);
            return objTempPlantillas;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return null;
    }
        
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialVertical(PlantillaCombo objPlantillaCombo){
        try{            
            int columnas = 0;
            int proxX = 0;            
            ArrayList<PlantillaComponente> objTempPlantillas = new ArrayList<PlantillaComponente>();            
            //Se crea la Plantilla Componente para el Componente Parent
            PlantillaComponente objPlantilla = new PlantillaComponente();                            
            objPlantilla.setX(columnas);
            objPlantilla.setY(proxX);            
            objPlantilla.updateGridBadConstraintsFromComponente(objComponenteGeneradorReturn, objPlantillaCombo, true);
            objPlantilla.setGenerador(true);
            objPlantilla.setHeight(this.objComponenteGeneradorReturn.getObjGridBagConstraints().gridheight);
            objPlantilla.setWidth(this.objComponenteGeneradorReturn.getObjGridBagConstraints().gridwidth);                    
            objPlantilla.setIdComponente(this.objComponenteGeneradorReturn.getId());
            objPlantilla.setId(objTempPlantillas.size());
            objPlantilla.setIdPlantilla(0);
            objPlantilla.setIncluido(true);
            objPlantilla.setZona(0);
            objTempPlantillas.add(objPlantilla);
            return objTempPlantillas;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
        
    public ArrayList<PlantillaComponente> getDistribucionGrupalInicialRectangular(PlantillaCombo objPlantillaCombo){
        try{
            return null;
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    
    /**
     * Devuelve la Representación del Valor de Retorno.
     * @return Componente Generador que Representa el Valor de Retorno.
     */
    public ComponenteDistribuidorGenerador getObjComponenteGeneradorReturn() {
        return objComponenteGeneradorReturn;
    }

    /**
     * Establece la Representación del Valor de Retorno.
     * @param objComponenteGeneradorReturn Componente Generador que Representa el Valor de Retorno.
     */
    public void setObjComponenteGeneradorReturn(ComponenteDistribuidorGenerador objComponenteGeneradorReturn) {
        this.objComponenteGeneradorReturn = objComponenteGeneradorReturn;
    }   
    
    public int sizeWidth() {
      try{
        int size = 0;        
        for(ComponenteGeneradoSimple objComponente : this.objComponentesGenerados){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;
        }
        return size + this.objComponenteGeneradorReturn.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridwidth;         
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }

    public int sizeHeight() {
      try{
        int size = 0;
        for(ComponenteGeneradoSimple objComponente : this.objComponentesGenerados){
            size += objComponente.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;
        }
        return size + this.objComponenteGeneradorReturn.getObjPlantillaComponenteDistribucionIndividualSeleccionada().getObjGridBagConstraints().gridheight;          
    }catch(java.lang.NullPointerException ex){}
      return 0;
    }
    
    public boolean ubicarComponentesEnTablaDistribucion(){        
        try{
            Distribuidor objDistribuidorSeleccionado = this.getObjDistribuidorGrupalSeleccionado();
            return objDistribuidorSeleccionado.generarTablaDistribucion();
        }catch(java.lang.Exception ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    
    @Override
    public Componente buscarComponente(String strName) {
        try{   
            strName = Utileria.formatStringSinHTML(strName);
            Componente objComponente;
            //Primero se Busca en la Colección de Componentes Incluidos
            objComponente = this.buscarComponenteEnDistribucion(strName);
            if(objComponente != null){
                return objComponente;
            }
            //Luego busco en los Componentes Generados
            objComponente = this.getObjComponenteIncluido(strName);
            if(objComponente != null){
                return objComponente;
            }
            if(this.objComponenteGeneradorReturn.getName().equals(strName)){
                return this.objComponenteGeneradorReturn;
            }
        }catch(java.lang.NullPointerException ex){            
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
    

    @Override    
    public String toString() {
      try{
        if(this.eBiblioteca == TipoBiblioteca.eSwap) {
            return this.objClassSwing.getSimpleName() + "BS" + this.dni + this.idClaseComponenteGeneradorMetodoGetter;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eLocal) {
            return this.objClassSwing.getSimpleName() + "BL" + this.dni + this.idClaseComponenteGeneradorMetodoGetter;
        }
        else if(this.eBiblioteca == TipoBiblioteca.eGlobal) {
            return this.objClassSwing.getSimpleName() + "BG" + this.dni + this.idClaseComponenteGeneradorMetodoGetter;
        }
        else if(this.getObjPropiedadesDisponibles() != null){            
            //se evalua si la propiedad name ha sido inicializada
            if(!this.getObjPropiedadesDisponibles().isEmpty()){                
                return this.getName();
            }
        }
        return this.objClassSwing.getSimpleName() + this.dni + this.idClaseComponenteGeneradorMetodoGetter;
        }catch(java.lang.NullPointerException ex){}
      return "";
    }   
    
    @Override
    public int compareTo(Object o) {
      try{
            ComponenteDistribuidorGeneradorMetodoGetter obj = (ComponenteDistribuidorGeneradorMetodoGetter) o;
            if(this.idClaseComponenteGeneradorMetodoGetter > obj.idClaseComponenteGeneradorMetodoGetter) {
                return 1;
            }
            else if(this.idClaseComponenteGeneradorMetodoGetter < obj.idClaseComponenteGeneradorMetodoGetter) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
      return 0;
    }   
    
    public boolean actualizarPlantillaComboDistribucionGrupalSeleccionada(PlantillaCombo objPlantillaComboSeleccionada) {
      try{
        try{
            this.objPlantillaComboDistribucionIndividualSeleccionada = objPlantillaComboSeleccionada;
            this.objComponenteGeneradorReturn.objPlantillaComboDistribucionIndividualSeleccionada = objPlantillaComboSeleccionada;
            for(ComponenteGeneradoSimple objComponenteGenerado : this.objComponentesGenerados){
                objComponenteGenerado.setObjPlantillaComboDistribucionIndividualSeleccionada(objPlantillaComboSeleccionada);
            }            
            return true;
        }catch(java.lang.ArrayIndexOutOfBoundsException ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
        }catch(java.lang.ArrayStoreException ex){
            Logger.getLogger(ComponenteDistribuidorGeneradorUnitario.class.getName()).log(Level.SEVERE, null, ex);            
        }
      }catch(java.lang.NullPointerException ex){}
      return false;
    }   
    
    @Override
    public void ok() {
        if(this.previsualizar){
            this.idClaseComponenteGeneradorMetodoGetter = ComponenteDistribuidorGeneradorMetodoGetter.serialIdComponenteGeneradorMetodoGetter++;
            this.previsualizar = false;
        }
    }
    
    @Override
    public boolean equals(Object obj) {
        if(obj instanceof ComponenteDistribuidorGeneradorMetodoGetter){
            ComponenteDistribuidorGeneradorMetodoGetter objComponente = (ComponenteDistribuidorGeneradorMetodoGetter) obj;
            return this.toString().equals(objComponente.toString());
        }
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
       try{
            int hash = 3;
            hash = 31 * hash + this.idClaseComponenteGeneradorMetodoGetter;
            return hash;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }
    
    public void importId(int id){
        ComponenteDistribuidorGeneradorMetodoGetter.serialIdComponenteGeneradorMetodoGetter = ++id;
        this.idClaseComponenteGeneradorMetodoGetter = ComponenteDistribuidorGeneradorMetodoGetter.serialIdComponenteGeneradorMetodoGetter++;
    }       
    
    @Override
    public Componente getObjComponenteIncluido(String strName) {
        try{            
            for(ComponenteGeneradoSimple objComponenteGenerado : this.getObjComponentesGenerados()){
                String strPropertiesName = (String) objComponenteGenerado.getName();
                if(strName.equals(strPropertiesName)){
                    return objComponenteGenerado;                    
                }                
            }             
            String strPropertiesName = (String) this.objComponenteGeneradorReturn.getName();
            if(strName.equals(strPropertiesName)){
                return this;
            }            
        }catch(java.lang.NullPointerException ex){}
        return null;
    }

//    @Override
//    protected Object clone() {
//        ComponenteDistribuidorGeneradorMetodoGetter objClon = null;
//        //Primero se Clona la Referencia Local
//        objClon = (ComponenteDistribuidorGeneradorMetodoGetter) super.clone();
//        //Ahora se hace la Clonación Profunda
//        if(objComponenteGeneradorReturn != null){
//            ((ComponenteDistribuidorGeneradorMetodoGetter)objClon).setObjComponenteGeneradorReturn((ComponenteDistribuidorGenerador)objComponenteGeneradorReturn.clone());
//        }         
//        return objClon;
//    }    
}

